package br.com.bestOffer.ejb.placaMae.entity;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import br.com.bestOffer.ejb.pciExpress.entity.PciExpress;
import br.com.bestOffer.ejb.produto.entity.Produto;
import br.com.bestOffer.ejb.soquete.entity.Soquete;
import br.com.bestOffer.enumerator.CategoriaProduto;
import br.com.bestOffer.enumerator.VersaoMemoriaRam;

@Entity
@Table(name="TB06_PLACA_MAE")
@DiscriminatorValue("PlacaMae")
@NamedQueries({
	@NamedQuery(name="PlacaMae.listarTodasPlacasMae", query="SELECT p FROM PlacaMae p "),
	@NamedQuery(name="PlacaMae.buscarPlacaMaePorID", query="SELECT p FROM PlacaMae p LEFT JOIN FETCH p.slotsExpancao WHERE p.id = :idProduto"),
	@NamedQuery(name="PlacaMae.buscarPlacaMaePorArquitetura", query="SELECT p FROM PlacaMae p WHERE p.id.soquete.arquitetura = :arquitetura")
})
public class PlacaMae extends Produto implements Serializable{
	
	private static final long serialVersionUID = 5252623608363292423L;
	
	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name="FK_ID_soquete",nullable=false)
	private Soquete soquete;
	
	@Column(name="qtd_bancos_memoria",nullable=false)
	private Integer qtdBancosMemoria;
	
	@Column(name="quantidade_memoria_suportada",nullable=false)
	private Integer maximaMemoriaSuportada;
	
	@Column(name="suporte_dualChanel",nullable=false)
	private Boolean dualChanel;
	
	@Column(name="sli",nullable=false)
	private Boolean sli;
	
	@Column(name="crossfire",nullable=false)
	private Boolean crossfire;
	
	@Column(name="tdp_processador",nullable=false)
	private Integer TDPProcessador;
	
	@Column(name="vrsao_memoria_ram",nullable=false)
	@Enumerated
	private VersaoMemoriaRam versaoMemoriaRam;
	
	@Column(name="frqcia_minima_memoria",nullable=false)
	private Integer frqciaMinimaMemoria;
	
	@Column(name="frqcia_maxima_memoria",nullable=false)
	private Integer frqciaMaximaMemoria;
	
	@Column(name="qtd_portas_sata",nullable=false)
	private Integer qtdPortasSata;
	
	@OneToMany(fetch = FetchType.LAZY ,cascade = CascadeType.ALL ,targetEntity = PciExpress.class, mappedBy = "placaMae")
	private List<PciExpress> slotsExpancao = new ArrayList<PciExpress>();
	
	public PlacaMae() {
	 this.setCategoriaProduto(CategoriaProduto.PlacaMae);
	}

	public Soquete getSoquete() {
		return soquete;
	}

	public void setSoquete(Soquete soquete) {
		this.soquete = soquete;
	}

	public Integer getQtdBancosMemoria() {
		return qtdBancosMemoria;
	}

	public void setQtdBancosMemoria(Integer qtdBancosMemoria) {
		this.qtdBancosMemoria = qtdBancosMemoria;
	}

	public Integer getMaximaMemoriaSuportada() {
		return maximaMemoriaSuportada;
	}

	public void setMaximaMemoriaSuportada(Integer maximaMemoriaSuportada) {
		this.maximaMemoriaSuportada = maximaMemoriaSuportada;
	}

	public Boolean getDualChanel() {
		return dualChanel;
	}

	public void setDualChanel(Boolean dualChanel) {
		this.dualChanel = dualChanel;
	}
	
	public Boolean getSli() {
		return sli;
	}

	public void setSli(Boolean sli) {
		this.sli = sli;
	}

	public Boolean getCrossfire() {
		return crossfire;
	}

	public void setCrossfire(Boolean crossfire) {
		this.crossfire = crossfire;
	}

	public Integer getTDPProcessador() {
		return TDPProcessador;
	}

	public void setTDPProcessador(Integer tDPProcessador) {
		TDPProcessador = tDPProcessador;
	}

	public VersaoMemoriaRam getVersaoMemoriaRam() {
		return versaoMemoriaRam;
	}

	public void setVersaoMemoriaRam(VersaoMemoriaRam versaoMemoriaRam) {
		this.versaoMemoriaRam = versaoMemoriaRam;
	}

	public Integer getFrqciaMinimaMemoria() {
		return frqciaMinimaMemoria;
	}

	public void setFrqciaMinimaMemoria(Integer frqciaMinimaMemoria) {
		this.frqciaMinimaMemoria = frqciaMinimaMemoria;
	}

	public Integer getFrqciaMaximaMemoria() {
		return frqciaMaximaMemoria;
	}

	public void setFrqciaMaximaMemoria(Integer frqciaMaximaMemoria) {
		this.frqciaMaximaMemoria = frqciaMaximaMemoria;
	}

	public Integer getQtdPortasSata() {
		return qtdPortasSata;
	}

	public void setQtdPortasSata(Integer qtdPortasSata) {
		this.qtdPortasSata = qtdPortasSata;
	}

	public List<PciExpress> getSlotsExpancao() {
		return slotsExpancao;
	}

	public void setSlotsExpancao(List<PciExpress> slotsExpancao) {
		this.slotsExpancao = slotsExpancao;
	}
	
	
	
}
